from flask import request, jsonify
from aps import app
from aps.models.usuario import *
from aps.models.proyecto import *
from aps.models.proyectousuario import *

@app.route('/crear_usuario', methods=['GET', 'POST'])  
def crear_usuario():
    """
    Nos permite traer los parametros que fueron cargados por el usuario
    y guardarlos en la base de datos.
    @param request: objeto que encapsula la peticion del cliente
    @return : True si la accion se realizo correctamente
    """     
    ci            = request.form['ci']
    nombres       = request.form['nombres']
    apellidos     = request.form['apellidos']
    fechanac      = request.form['fechanac']
    sexo          = request.form['sexo']
    nick          = request.form['nick']
    password      = request.form['password']
    email         = request.form['email']
    telefono      = request.form['telefono']
    direccion     = request.form['direccion']
    observaciones = request.form['observaciones']
    # se agrega a la BD
    model         = Usuario(ci, nombres, apellidos, nick, password, email, telefono, direccion, observaciones, sexo, fechanac)
    bdsession.add(model)
    return jsonify({'success' : True})

@app.route('/modificar_usuario', methods=['GET', 'POST'])   
def modificar_usuario():
    """
    Nos permite traer los parametros que fueron modificados por el usuario
    y guardar los cambios en la base de datos.
    @param request: objeto que encapsula la peticion del cliente
    @return : True si la accion se realizo correctamente
    """ 
    id            = request.form['id']
    ci            = request.form['ci']
    nombres       = request.form['nombres']
    apellidos     = request.form['apellidos']
    fechanac      = request.form['fechanac']
    sexo          = request.form['sexo']
    nick          = request.form['nick']
    password      = request.form['password']
    email         = request.form['email']
    telefono      = request.form['telefono']
    direccion     = request.form['direccion']
    observaciones = request.form['observaciones']
    #se modifica en la BD
    model         = Usuario(ci, nombres, apellidos, nick, password, email, telefono, direccion, observaciones, sexo, fechanac)
    model.id      = id
    bdsession.merge(model)  
    return jsonify({'success' : True})
   
@app.route('/consultar_usuario', methods=['GET', 'POST'])    
def consultar_usuario():
    """
    Nos permite traer los parametros de consulta(el filtro y el valor) y mostrar
    los usuarios que cumplen con la condicion del filtro.
    @param request: objeto que encapsula la peticion del cliente
    @return : si la accion se realizo correctamente
    """
    usuarios = None
    
    if not request.args.has_key('id_proyecto'):
        if request.args.has_key('filtro'):
            filtro    = request.args['filtro']
            valor     = request.args['valor']
            sentencia = 'SELECT * from Usuario WHERE {0}=\'{1}\''.format(filtro,valor)
            usuarios  = bdsession.query(Usuario).from_statement(sentencia).all()
        else:
            usuarios  = bdsession.query(Usuario).all()
       
    else: 
        id_proyecto   = request.args['id_proyecto']        
        if request.args.has_key('filtro'):
            filtro    = request.args['filtro']
            valor     = request.args['valor']
            sentencia = 'SELECT * from Usuario WHERE id in (SELECT idusuario from ProyectoUsuario WHERE idproyecto = {0}) and {1}=\'{2}\''.format(id_proyecto, filtro,valor)
            usuarios  = bdsession.query(Usuario).from_statement(sentencia).all()
        else:
            sentencia = 'SELECT * from Usuario WHERE id in (SELECT idusuario from ProyectoUsuario WHERE idproyecto = {0})'.format(id_proyecto)
            usuarios  = bdsession.query(Usuario).from_statement(sentencia).all()
       
    data = []
    for usuario in usuarios:
        item = {}
        item['id'] = usuario.id
        item['ci'] = usuario.ci
        item['nick'] = usuario.nick
        item['nombres'] = usuario.nombres
        item['apellidos'] = usuario.apellidos
        item['direccion'] = usuario.direccion
        item['email'] = usuario.email
        data.append(item)
    return jsonify({'success':True, 'data':data, 'total':len(data)})

             
@app.route('/consultar_usuario_completo', methods=['GET', 'POST'])  
def consultar_usuario_completo():
    """
    Nos permite traer los parametros de consulta(el filtro y el valor) y mostrar los campos
    completos de los usuarios que cumplen con la condicion del filtro.
    @param request: objeto que encapsula la peticion del cliente
    @return : si la accion se realizo correctamente
    """
    usuarios = None
    if 'filtro' in request.form:
        filtro    = request.form['filtro']
        valor     = request.form['valor']
        sentencia = 'SELECT * from Usuario WHERE {0}=\'{1}\''.format(filtro,valor)
        usuarios  = bdsession.query(Usuario).from_statement(sentencia).all()
    else:
        usuarios  = bdsession.query(Usuario).all()
       
    data = []
    for usuario in usuarios:
        item = {}
        item['id'] = usuario.id
        item['ci'] = usuario.ci
        item['nombres'] = usuario.nombres
        item['apellidos'] = usuario.apellidos
        item['email'] = usuario.email
        item['telefono'] = usuario.telefono
        item['direccion'] = usuario.direccion
        item['observaciones'] = usuario.observaciones
        item['nick'] = usuario.nick
        item['password'] = usuario.password
        item['sexo'] = usuario.sexo
        item['fechanac'] = str(usuario.fechanac)
        data.append(item)
    return jsonify({'success':True, 'data':data, 'total':len(data)})
   
@app.route('/eliminar_usuario', methods=['GET', 'POST'])  
def eliminar_usuario():
    """
    Nos permite traer el id del usuario a eliminar, eliminar las dependendcias
    del mismo con respecto a otras tablas y eliminar el registro de la base de datos.
    @param request: objeto que encapsula la peticion del cliente
    @return : True si la accion se realizo correctamente y False en caso contrario
    """ 
    id      = request.form['id']
    usuario = bdsession.query(Usuario).filter_by(id=id).first()
    if usuario is None:
        return jsonify({'success':False})
       
#     ANTIGUA ELIMINACION EN CASCADA
#     usuario.eliminar_dependencias()
#     bdsession.refresh(usuario)
#     bdsession.delete(usuario)
       
    try:
        bdsession.delete(usuario)
        return jsonify({'success' : True})
    except AssertionError:
        return jsonify({'success' : False})
   
@app.route('/consulta_asignar_usuarios', methods=['GET', 'POST'])  
def consulta_asignar_usuarios():
    """
    Nos permite traer todos los usuarios asignados y asignables a un proyecto
    @param request: objeto que encapsula la peticion del cliente
    @return: True si la accion se realizo correctamente, la lista de permisos asignados al rol y la lista de permisos asignables al proyecto
    """
    def process_usuario_list(list):
        """
        Serializa una lista de con los datos de los usuarios para enviarla al cliente
        @param list: lista de objectos Usuario obtenidas desde la BD
        @return: result lista procesada de usuarios
        """
        result = []
        for usuario in list:
            item = [None,None,None,None]
            item[0] = usuario.id
            item[1] = usuario.nick
            item[2] = usuario.nombres
            item[3] = usuario.apellidos
            result.append(item)
        return result
       
    id_proyecto = request.form['id']
    #Obtenemos la lista de usuarios que fueron asignados al proyecto
    #Usuarios es de tipo ProyectoUsuario[] por tanto es necesario extraer el 'usuario' de la relacion
    usuarios_asignados = [x.usuario for x in bdsession.query(Proyecto).filter_by(id=id_proyecto).first().usuarios]
    #Obtenemos la lista de usuarios que no fueron asignados al proyecto
    usuarios_asignables = bdsession.query(Usuario).from_statement('select * from Usuario where id not in (select idusuario from ProyectoUsuario where idproyecto=\'{0}\')'.format(id_proyecto)).all()
       
    asignados  = process_usuario_list(usuarios_asignados)
    asignables = process_usuario_list(usuarios_asignables)
   
    return jsonify({'success':True, 'asignados':asignados, 'asignables':asignables})

   
           
@app.route('/consulta_usuario_combo', methods=['GET','POST'])
def consulta_usuario_combo():
    """
    Nos permite obtener la lista de usuarios del sistema
    @param request: objeto que encapsula la peticion del cliente
    @return: True si la accion se realizo correctamente
    """
    usuarios    = None 
    usuarios    = bdsession.query(Usuario).all()
    data = []
    for usuario in usuarios:
        item = {}
        item['id'] = usuario.id
        item['nick'] = usuario.nick
        item['nombres'] = usuario.nombres
        item['apellidos'] = usuario.apellidos
        data.append(item)
    return jsonify({'total':len(data), 'data':data})
     
     
@app.route('/consulta_asignar_usuarios_comite', methods=['GET', 'POST'])  
def consulta_asignar_usuarios_comite():
    """
    Nos permite traer todos los usuarios asignados y asignables a un comite dentro de un proyecto
    @param request: objeto que encapsula la peticion del cliente
    @return: True si la accion se realizo correctamente, la lista de permisos asignados al rol y la lista de permisos asignables al proyecto
    """
    
    def process_usuario_list(list):
        """
        Serializa una lista de con los datos de los usuarios para enviarla al cliente
        @param list: lista de objectos Usuario obtenidas desde la BD
        @return: result lista procesada de usuarios
        """
        
        
        result = []
        for usuario in list:
            item = [None,None,None,None]
            item[0] = usuario.id
            item[1] = usuario.nick
            item[2] = usuario.nombres
            item[3] = usuario.apellidos
            result.append(item)
        return result

    
    id_proyecto = request.form['id']
    #Obtenemos la lista de usuarios que fueron asignados al proyecto
    #Usuarios es de tipo ProyectoUsuario[] por tanto es necesario extraer el 'usuario' de la relacion
    sentencia='select * from Usuario where id  in (select idusuario from ProyectoUsuario where idproyecto=\'{0}\' and comite=0)'
    usuarios_asignables = bdsession.query(Usuario).from_statement(sentencia.format(id_proyecto)).all()
    #Obtenemos la lista de usuarios que no fueron asignados al proyecto
    sentencia='select * from Usuario where id  in (select idusuario from ProyectoUsuario where idproyecto=\'{0}\' and comite=1)'
    usuarios_asignados = bdsession.query(Usuario).from_statement(sentencia.format(id_proyecto)).all()
    
    #### tengo que preguntar si tiene el rol de comite,en el proyecto ese usuario
    ### con la tabla proyectorolusuario
    
    
    asignables  = process_usuario_list(usuarios_asignables)
    asignados = process_usuario_list(usuarios_asignados)
    return jsonify({'success':True, 'asignados':asignados, 'asignables':asignables})


